package algorithm_demo.demo05;

/**
 * 给定一个数组，代表每个人喝完咖啡准备刷杯子的时间只有一台咖啡机，
 * 一次只能洗一个杯子，时间耗费a，洗完才能洗下一杯
 * 每个咖啡杯也可以自己挥发干净，时间耗费b，咖啡杯可以并行挥发
 * 返回让所有咖啡杯变干净的最早完成时间三个参数: int[] arr、int a、int br
 * <p>
 * 尝试模型第四种 寻找业务限制的尝试模型
 *
 * @author Api
 * @date 2023/3/21 23:49
 */
public class Code15 {
    /*暴力递归*/
    /**
     * process(drinks, 3, 10, 0, 0)
     *
     * @param drinks   ，每一个员工喝完的时间 固定变量
     * @param a        洗一杯的时间 固定变量
     * @param b        自己挥发赶紧的时间 固定变量
     * @param index    drinks[0..index-1]都已经干净了，不用你操作了
     * @param washLine drinks[index...]都想变干净，这是我操心的，washLine表示洗的机器何时可用
     * @return 变干净，最少的时间点返回
     */
    public static int process(int[] drinks, int a, int b, int index, int washLine) {
        if (index == drinks.length - 1) {
            return Math.min(Math.max(washLine, drinks[index]) + a, drinks[index] + b);
        }
        //剩下不止一杯咖啡
        //wash 是我当前的咖啡杯，洗完的时间
        int wash = Math.max(washLine, drinks[index]) + a;//洗完index一杯，结束的时间点
        //index+1...变干净的最早时间
        int next1 = process(drinks, a, b, index + 1, wash);
        //index...
        int p1 = Math.max(wash, next1);

        int dry = drinks[index] + b;//挥发，index一杯，结束的时间点
        int next2 = process(drinks, a, b, index + 1, washLine);
        int p2 = Math.max(dry, next2);

        return Math.min(p1, p2);
    }
}
